#!/bin/bash

# 中间件测试管理脚本
# 支持单独测试每个中间件或全部测试

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

echo -e "${BLUE}=== 中间件测试管理脚本 ===${NC}"
echo

# 检查 docker 和 docker-compose 是否安装
check_dependencies() {
    if ! command -v docker &> /dev/null; then
        echo -e "${RED}❌ Docker 未安装${NC}"
        exit 1
    fi
    
    if ! command -v docker-compose &> /dev/null; then
        echo -e "${RED}❌ Docker Compose 未安装${NC}"
        exit 1
    fi
    
    echo -e "${GREEN}✅ 依赖检查通过${NC}"
}

# 赋予执行权限
setup_permissions() {
    chmod +x test-*.sh
    echo -e "${GREEN}✅ 测试脚本权限设置完成${NC}"
}

# 显示帮助信息
show_help() {
    echo "使用方法:"
    echo "  $0 [选项] [服务名]"
    echo
    echo "选项:"
    echo "  -h, --help      显示帮助信息"
    echo "  -l, --list      列出所有可用服务"
    echo "  -a, --all       测试所有服务"
    echo "  -s, --stop      停止所有测试服务"
    echo "  -c, --clean     清理所有测试数据"
    echo
    echo "服务名:"
    echo "  mysql           测试 MySQL 数据库"
    echo "  redis           测试 Redis 缓存"
    echo "  nginx           测试 Nginx 网关"
    echo "  prometheus      测试 Prometheus 监控"
    echo "  grafana         测试 Grafana 可视化"
    echo
    echo "示例:"
    echo "  $0 mysql        # 测试 MySQL"
    echo "  $0 -a           # 测试所有服务"
    echo "  $0 --stop       # 停止所有服务"
}

# 列出所有服务
list_services() {
    echo -e "${BLUE}可用的中间件服务:${NC}"
    echo "1. mysql      - MySQL 8.0 数据库"
    echo "2. redis      - Redis 7 缓存"
    echo "3. nginx      - Nginx Alpine 网关"
    echo "4. prometheus - Prometheus 监控"
    echo "5. grafana    - Grafana 可视化"
}

# 测试单个服务
test_service() {
    local service=$1
    echo -e "${YELLOW}开始测试 $service...${NC}"
    
    case $service in
        mysql)
            if [ -f "test-mysql.sh" ]; then
                ./test-mysql.sh
            else
                echo -e "${RED}❌ MySQL 测试脚本不存在${NC}"
                return 1
            fi
            ;;
        redis)
            if [ -f "test-redis.sh" ]; then
                ./test-redis.sh
            else
                echo -e "${RED}❌ Redis 测试脚本不存在${NC}"
                return 1
            fi
            ;;
        nginx)
            if [ -f "test-nginx.sh" ]; then
                ./test-nginx.sh
            else
                echo -e "${RED}❌ Nginx 测试脚本不存在${NC}"
                return 1
            fi
            ;;
        prometheus)
            if [ -f "test-prometheus.sh" ]; then
                ./test-prometheus.sh
            else
                echo -e "${RED}❌ Prometheus 测试脚本不存在${NC}"
                return 1
            fi
            ;;
        grafana)
            if [ -f "test-grafana.sh" ]; then
                ./test-grafana.sh
            else
                echo -e "${RED}❌ Grafana 测试脚本不存在${NC}"
                return 1
            fi
            ;;
        *)
            echo -e "${RED}❌ 未知服务: $service${NC}"
            echo "使用 -l 查看所有可用服务"
            return 1
            ;;
    esac
}

# 测试所有服务
test_all_services() {
    local services=("mysql" "redis" "nginx" "prometheus" "grafana")
    local failed_services=()
    
    echo -e "${BLUE}开始测试所有服务...${NC}"
    echo
    
    for service in "${services[@]}"; do
        echo -e "${YELLOW}======== 测试 $service ========${NC}"
        if test_service $service; then
            echo -e "${GREEN}✅ $service 测试通过${NC}"
        else
            echo -e "${RED}❌ $service 测试失败${NC}"
            failed_services+=($service)
        fi
        echo
        sleep 2
    done
    
    # 显示测试结果摘要
    echo -e "${BLUE}======== 测试结果摘要 ========${NC}"
    echo "总测试服务数: ${#services[@]}"
    echo -e "成功: ${GREEN}$((${#services[@]} - ${#failed_services[@]}))${NC}"
    echo -e "失败: ${RED}${#failed_services[@]}${NC}"
    
    if [ ${#failed_services[@]} -gt 0 ]; then
        echo -e "${RED}失败的服务:${NC}"
        for service in "${failed_services[@]}"; do
            echo "  - $service"
        done
        return 1
    else
        echo -e "${GREEN}🎉 所有服务测试通过!${NC}"
        return 0
    fi
}

# 停止所有测试服务
stop_all_services() {
    echo -e "${YELLOW}停止所有测试服务...${NC}"
    
    local compose_files=("mysql-compose.yml" "redis-compose.yml" "nginx-compose.yml" "prometheus-compose.yml" "grafana-compose.yml")
    
    for compose_file in "${compose_files[@]}"; do
        if [ -f "$compose_file" ]; then
            echo "停止 $compose_file..."
            docker-compose -f "$compose_file" down 2>/dev/null
        fi
    done
    
    echo -e "${GREEN}✅ 所有测试服务已停止${NC}"
}

# 清理测试数据
clean_test_data() {
    echo -e "${YELLOW}清理测试数据...${NC}"
    
    # 停止所有服务
    stop_all_services
    
    # 删除测试卷
    echo "删除测试数据卷..."
    docker volume rm $(docker volume ls -q | grep -E "(mysql_test_data|redis_test_data|prometheus_test_data|grafana_test_data)") 2>/dev/null || true
    
    # 删除测试容器
    echo "删除测试容器..."
    docker rm $(docker ps -aq --filter="name=test-") 2>/dev/null || true
    
    # 删除未使用的网络
    echo "清理未使用的网络..."
    docker network prune -f 2>/dev/null || true
    
    echo -e "${GREEN}✅ 测试数据清理完成${NC}"
}

# 主程序
main() {
    cd "$(dirname "$0")"
    
    check_dependencies
    setup_permissions
    
    case "${1:-}" in
        -h|--help)
            show_help
            ;;
        -l|--list)
            list_services
            ;;
        -a|--all)
            test_all_services
            ;;
        -s|--stop)
            stop_all_services
            ;;
        -c|--clean)
            read -p "确定要清理所有测试数据? (y/N): " -n 1 -r
            echo
            if [[ $REPLY =~ ^[Yy]$ ]]; then
                clean_test_data
            else
                echo "取消清理操作"
            fi
            ;;
        "")
            echo -e "${YELLOW}请指定要测试的服务或使用 -h 查看帮助${NC}"
            list_services
            ;;
        *)
            test_service "$1"
            ;;
    esac
}

# 信号处理
trap 'echo -e "\n${YELLOW}测试被中断${NC}"; exit 130' INT

main "$@"